package cn.jbolt.ai.core.chain.node.output.toclient;

import cn.hutool.core.util.StrUtil;
import cn.jbolt.ai.core.chain.node.base.AppConfigConstant;
import cn.jbolt.ai.core.chain.ChainContext;
import cn.jbolt.ai.core.chain.node.base.BaseNode;
import cn.jbolt.ai.core.chain.node.provider.CommonNodeProvider;
import com.fasterxml.jackson.databind.JsonNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Objects;

/**
 * 输出内容到客户端的节点
 */
@Component
public class OutputToClientNodeProvider extends BaseNode implements CommonNodeProvider {
    private static final Logger logger = LoggerFactory.getLogger(OutputToClientNodeProvider.class);

    @Override
    public void provide(JsonNode nodeConfig, ChainContext context) {
        OutputToClientConfig config = null;
        JsonNode configJson = nodeConfig.get(AppConfigConstant.CONFIG_TYPE_OUTPUT_TO_CLIENT);
        if (configJson == null) {
            //兼容旧版本
            config = OutputToClientConfig.from(nodeConfig);
        } else {
            config = OutputToClientConfig.from(configJson);
        }

        if (config == null || StrUtil.isBlank(config.getInputField())) {
            throw new RuntimeException("输出到客户端节点未配置输入字段");
        }

        String content = generateContent(config, context);
        context.sendResponseMsg(content, config.getRenderType());
        if (config.isPersistDb()) {
            context.getResponseMsg().appendContent(content);
        }
    }

    /**
     * 生成内容
     *
     * @param config  配置
     * @param context 上下文
     * @return 处理后的提示词
     */
    public String generateContent(OutputToClientConfig config, ChainContext context) {

        // 输入字段来自其他输出，则根据key读取对应值
        if (Objects.equals(config.getInputField(), AppConfigConstant.INPUT_FROM_CUSTOM) == false) {
            Object value = context.getAttr(config.getInputField());
            return valueToString(value);
        }

        // 否则就是自定义输入，就要根据模板渲染了
        // 模板为空，则直接返回原始的提示词
        if (StrUtil.isBlank(config.getInputTpl())) {
            throw new RuntimeException("未设置模版内容");
        }

        //模板不为空，则根据模板渲染
        String template = config.getInputTpl();
        if (context.getArgs() == null || context.getArgs().isEmpty()) {
            return template;
        }


        return replaceArgs(template, context.getArgs());
    }
}
